Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
53.85% covered (warning)
53.85%
7 / 13
CRAP
59.57% covered (warning)
59.57%
28 / 47
UploadedImageSubscriber
0.00% covered (danger)
0.00%
0 / 1
53.85% covered (warning)
53.85%
7 / 13
62.05
59.57% covered (warning)
59.57%
28 / 47
 __construct
0.00% covered (danger)
0.00%
0 / 1
2.06
75.00% covered (warning)
75.00%
3 / 4
 getSubscribedEvents
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 postRemove
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
3 / 3
 preUpdate
0.00% covered (danger)
0.00%
0 / 1
3.37
30.00% covered (danger)
30.00%
3 / 10
 prePersist
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 postPersist
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 postUpdate
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 handleImageUpload
0.00% covered (danger)
0.00%
0 / 1
6.00
50.00% covered (danger)
50.00%
5 / 10
 updateImageName
0.00% covered (danger)
0.00%
0 / 1
2.26
60.00% covered (warning)
60.00%
3 / 5
 getUploadRootDir
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 1
 removeImage
0.00% covered (danger)
0.00%
0 / 1
10.40
40.00% covered (danger)
40.00%
2 / 5
 hasUploadedImage
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
1 / 1
 isExpectedEntity
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
<?php
namespace Akeneo\UserManagement\Bundle\EventListener;
use Akeneo\UserManagement\Component\EntityUploadedImageInterface;
use Doctrine\Common\EventSubscriber;
use Doctrine\ORM\Event\LifecycleEventArgs;
class UploadedImageSubscriber implements EventSubscriber
{
    /**
     * @var string
     */
    protected $webRoot;
    /**
     * Define web root path.
     *
     * @param  string                    $kernelRootDir
     * @throws \InvalidArgumentException
     */
    public function __construct($kernelRootDir)
    {
        $this->webRoot = realpath($kernelRootDir . '/../web');
        if (!$this->webRoot) {
            throw new \InvalidArgumentException('Invalid kernel root');
        }
    }
    /**
     * {@inheritdoc}
     */
    public function getSubscribedEvents()
    {
        return [
            'preUpdate',
            'prePersist',
            'postPersist',
            'postUpdate',
            'postRemove'
        ];
    }
    /**
     * Remove uploaded image if any.
     *
     * @param LifecycleEventArgs $args
     */
    public function postRemove(LifecycleEventArgs $args)
    {
        /** @var EntityUploadedImageInterface $entity */
        $entity = $args->getEntity();
        $this->removeImage($entity);
    }
    /**
     * Handle preUpdate.
     *
     * @param LifecycleEventArgs $args
     */
    public function preUpdate(LifecycleEventArgs $args)
    {
        /** @var EntityUploadedImageInterface $entity */
        $entity = $args->getEntity();
        if ($this->hasUploadedImage($entity)) {
            $this->removeImage($entity);
            $this->updateImageName($args);
            $em = $args->getEntityManager();
            $uow = $em->getUnitOfWork();
            $uow->recomputeSingleEntityChangeSet(
                $em->getClassMetadata(get_class($entity)),
                $entity
            );
        }
    }
    /**
     * Handle prePersist.
     *
     * @param LifecycleEventArgs $args
     */
    public function prePersist(LifecycleEventArgs $args)
    {
        $this->updateImageName($args);
    }
    /**
     * Handle postPersist.
     *
     * @param LifecycleEventArgs $args
     */
    public function postPersist(LifecycleEventArgs $args)
    {
        $this->handleImageUpload($args);
    }
    /**
     * Handle postUpdate.
     *
     * @param LifecycleEventArgs $args
     */
    public function postUpdate(LifecycleEventArgs $args)
    {
        $this->handleImageUpload($args);
    }
    /**
     * Move uploaded image to upload dir.
     *
     * @param LifecycleEventArgs $args
     */
    protected function handleImageUpload(LifecycleEventArgs $args)
    {
        $entity = $args->getEntity();
        if ($this->isExpectedEntity($entity)) {
            if (!$this->hasUploadedImage($entity)) {
                return;
            }
            $dir = $this->getUploadRootDir($entity);
            if (!file_exists($dir)) {
                mkdir($dir, 0755, true);
            }
            $entity->getImageFile()->move($dir, $entity->getImage());
            $entity->unsetImageFile();
        }
    }
    /**
     * Update uploaded image name.
     *
     * @param LifecycleEventArgs $args
     */
    protected function updateImageName(LifecycleEventArgs $args)
    {
        /** @var EntityUploadedImageInterface $entity */
        $entity = $args->getEntity();
        if ($this->hasUploadedImage($entity)) {
            $filename = sha1(uniqid(mt_rand(), true));
            $entity->setImage($filename . '.' . $entity->getImageFile()->guessExtension());
        }
    }
    /**
     * Get upload directory location in FS.
     *
     * @param  EntityUploadedImageInterface $entity
     * @return string
     */
    protected function getUploadRootDir(EntityUploadedImageInterface $entity)
    {
        return rtrim($this->webRoot, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . $entity->getUploadDir();
    }
    /**
     * Remove image.
     *
     * @param EntityUploadedImageInterface $entity
     */
    protected function removeImage($entity)
    {
        if ($this->isExpectedEntity($entity) && $entity->getImage()) {
            $file = $this->getUploadRootDir($entity) . DIRECTORY_SEPARATOR . $entity->getImage();
            if (is_file($file) && is_writable($file)) {
                unlink($file);
            }
        }
    }
    /**
     * Check for new image upload.
     *
     * @param  EntityUploadedImageInterface $entity
     * @return bool
     */
    protected function hasUploadedImage($entity)
    {
        return $this->isExpectedEntity($entity) && null !== $entity->getImageFile();
    }
    /**
     * Check if entity acceptable by subscriber.
     *
     * @param  object $entity
     * @return bool
     */
    protected function isExpectedEntity($entity)
    {
        return $entity instanceof EntityUploadedImageInterface;
    }
}